package com.wwy.arithmetic.suanfa;

import lombok.Data;

/**
 * 两个链表之和
 *
 * @author 20706
 */
public class LianBiaoZhiHe {
    @Data
    static class ListNode {
        //类名 ：Java类就是一种自定义的数据结构
        int val;            //数据 ：节点数据
        ListNode next;      //对象 ：引用下一个节点对象。在Java中没有指针的概念，Java中的引用和C语言的指针类似

        public ListNode() {
        }

        ListNode(int val) {
            //构造方法 ：构造方法和类名相同
            this.val = val;     //把接收的参数赋值给当前类的val变量
        }

    }

    /**
     * 测试案例
     *
     * @param args
     */
    public static void main(String[] args) {
        ListNode listNode1 = new ListNode(2);
        ListNode listNode2 = new ListNode(4);
        ListNode listNode3 = new ListNode(3);
//        ListNode listNode4 = new ListNode(9);
//        ListNode listNode5 = new ListNode(9);
//        ListNode listNode6 = new ListNode(9);
//        ListNode listNode7 = new ListNode(9);
        listNode1.setNext(listNode2);
        listNode2.setNext(listNode3);
//        listNode3.setNext(listNode4);
//        listNode4.setNext(listNode5);
//        listNode5.setNext(listNode6);
//        listNode6.setNext(listNode7);

        ListNode listNodeA = new ListNode(5);
        ListNode listNodeB = new ListNode(6);
        ListNode listNodeC = new ListNode(4);
//        ListNode listNodeD = new ListNode(9);
        listNodeA.setNext(listNodeB);
        listNodeB.setNext(listNodeC);
//        listNodeC.setNext(listNodeD);
        ListNode listNodeNum = getListNodeNum(listNode1, listNodeA, new ListNode());
        System.out.println("listNodeNum = " + listNodeNum.toString());
    }

    static ListNode getListNodeNum(ListNode listNode, ListNode listNode1, ListNode node) {
        if (listNode == null && listNode1 == null && node.val != 0) {
            return node;
        }
        if (listNode == null && listNode1 == null) {
            return null;
        }
        if (listNode == null) {
            if (node != null && node.getVal() + listNode1.getVal() >= 10) {
                ListNode listNode2 = new ListNode();
                listNode2.setVal(1);
                node.setVal(node.getVal() + listNode1.getVal() - 10);
                node.next = getListNodeNum(null, listNode1.next, listNode2);
                return node;
            } else {
                node.setVal(node.getVal() + listNode1.getVal());
                node.next = getListNodeNum(null, listNode1.next, new ListNode());
            }
            return node;
        }
        if (listNode1 == null) {
            if (node != null && node.getVal() + listNode.getVal() >= 10) {
                ListNode listNode2 = new ListNode();
                listNode2.setVal(1);
                node.setVal(node.getVal() + listNode.getVal() - 10);
                node.setNext(getListNodeNum(listNode.next, null, listNode2));
                return node;
            } else {
                node.setVal(node.getVal() + listNode.getVal());
                node.setNext(getListNodeNum(listNode.next, null, new ListNode()));
            }
            return node;
        }
        int num = listNode.getVal() + listNode1.getVal();
        if (node != null) {
            num = num + node.getVal();
        }
        if (num >= 10) {
            num = num - 10;
            node.setVal(num);
            ListNode listNode3 = new ListNode(1);
            node.setNext(listNode3);
        } else {
            node.setVal(num);
        }
        if (node.getNext() == null) {
            node.setNext(getListNodeNum(listNode.next, listNode1.next, new ListNode()));
        } else {
            node.setNext(getListNodeNum(listNode.next, listNode1.next, node.getNext()));
        }
        return node;
    }


}
